package se.kernel;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ThreadEnviarArchivosMulticast implements Runnable
{
    private File archivo;
    private MulticastSocket socket;
    private InetAddress dir;
    private int puerto;

    public ThreadEnviarArchivosMulticast( File archivo, int puertoGrupo ) throws IOException
    {
        this.archivo = archivo;
        socket = new MulticastSocket( puertoGrupo );
        dir = InetAddress.getByName( "224.63.63.64" );
        socket.joinGroup( dir );
        this.puerto = puertoGrupo;
    }

    @Override
    public void run( )
    {
        try
        {
            String nombreArchivo = archivo.getName( );
            byte[] paquete = new byte[3 + nombreArchivo.getBytes( ).length + ( int )archivo.length( )];
            short tamNombre = ( short )nombreArchivo.getBytes( ).length;
            paquete[ 0 ] = ( byte ) ( tamNombre >> 8 );
            paquete[ 1 ] = ( byte ) ( ( tamNombre << 8 ) >> 8 );
            appendBytes( paquete, nombreArchivo.getBytes( ), 2 );
            FileInputStream in = new FileInputStream( archivo );
            byte[] bytesArchivo = new byte[( int )archivo.length( )];
            int offset = 0;
            int numRead = 0;
            while( offset < bytesArchivo.length && ( numRead = in.read( bytesArchivo, offset, bytesArchivo.length - offset ) ) >= 0 )
                offset += numRead;
            appendBytes( paquete, bytesArchivo, 2 + nombreArchivo.getBytes( ).length );
            paquete[ paquete.length - 1 ] = 26;

            byte[] buffer = new byte[4096];
            int index = 0;
            while( index < paquete.length )
            {
                buffer = darBytes( paquete, index, index + 4096 );
                DatagramPacket paqueteMulticast = new DatagramPacket( buffer, buffer.length, dir, puerto );
                socket.send( paqueteMulticast );
                index += 4096;
            }
            in.close( );
            socket.close( );
        }
        catch( FileNotFoundException e )
        {
            e.printStackTrace( );
        }
        catch( IOException e )
        {
            e.printStackTrace( );
        }

    }

    private void appendBytes( byte[] principal, byte[] append, int start )
    {
        for( int i = 0; i < append.length; i++ )
            principal[ i + start ] = append[ i ];
    }

    private byte[] darBytes( byte[] arreglo, int start, int finish )
    {
        byte[] resp = new byte[finish - start];
        for( int i = 0; i < resp.length && i + start < arreglo.length; i++ )
            resp[ i ] = arreglo[ i + start ];
        return resp;
    }
}